// **************************************************************
// COPYRIGHT(c)2016, Xidian University
// All rights reserved.
//
// IP LIB INDEX :  
// IP Name      :      
// File name    :  
// Module name  :  
// Full name    :  
// Time         : 2022 
// Author       : Wang-Zhenyu 
// Email        : 2047593704@qq.com
// Data         : 
// Version      : V 2.0 
// 
// Abstract     :
// Called by    :  
// 
// Modification history
// -----------------------------------------------------------------
// 2017.7.8\u66f4\u6539\u95ee\u9898\uff1a\u5e27\u8fd8\u6ca1\u6709\u5904\u7406\u7ed3\u675f\u65b0\u7684\u5e27\u5c31\u5230\u6765\uff0c\u5e94\u8be5\u9009\u62e9\u7a7a\u95f2\u7684RAM\u8fdb\u884c\u5b58\u50a8
// 
//
// *****************************************************************

// *******************
// TIMESCALE
// ******************* 
`timescale 1ns/1ps 
`include "top_define.v"
// *******************
// INFORMATION
// *******************

//*******************
//DEFINE(s)
//*******************
//`define UDLY 1    //Unit delay, for non-blocking assignments in sequential logic

//*******************
//DEFINE MODULE PORT
//*******************
module receive_contrl(
    //\u63a5\u6536\u6570\u636e\u5305
    input wire clk                 ,
    input wire rst_n                 ,
    input wire [9:0]ram_2p_cfg_register,
    input wire pkt_sop_i           ,
    input wire pkt_eop_i           ,
    input wire [255 :0] pkt_data_i ,
    input wire pkt_dval_i          ,
    // input wire pkt_dsav_i       ,
    input wire [4   :0] pkt_mod_i  ,
    //\u548c\u4e94\u4e2a\u89e3\u6790\u5668\u7684\u63a5\u53e3
    output reg [255 :0] dout0      ,
    output reg pkt_dval0           ,
    output reg pkt_sop0            ,
    output reg pkt_eop0            ,
    output reg [4   :0] pkt_mod0   ,
    
    output reg [255 :0] dout1      ,
    output reg pkt_dval1           ,
    output reg pkt_sop1            ,
    output reg pkt_eop1            ,
    output reg [4   :0] pkt_mod1   ,

    output reg [255 :0] dout2      ,
    output reg pkt_dval2           ,
    output reg pkt_sop2            ,
    output reg pkt_eop2            ,
    output reg [4   :0] pkt_mod2   ,

    output reg [255 :0] dout3      ,
    output reg pkt_dval3           ,
    output reg pkt_sop3            ,
    output reg pkt_eop3            ,
    output reg [4   :0] pkt_mod3   ,

    output reg [255 :0] dout4      ,
    output reg pkt_dval4           ,
    output reg pkt_sop4            ,
    output reg pkt_eop4            ,
    output reg [4   :0] pkt_mod4    

   );

//*******************
//DEFINE LOCAL PARAMETER
//*******************
//parameter(s)

             
                                    

 

//*********************
//INNER SIGNAL DECLARATION
//*********************
//REGS   
(*mark_debug = "true"*) wire[255:0] dout0_d,dout1_d,dout2_d,dout3_d,dout4_d;
(*mark_debug = "true"*) reg pkt_dval0_d,pkt_dval1_d,pkt_dval2_d,pkt_dval3_d,pkt_dval4_d;
(*mark_debug = "true"*) reg pkt_sop0_d,pkt_sop1_d,pkt_sop2_d,pkt_sop3_d,pkt_sop4_d;
(*mark_debug = "true"*) reg pkt_eop0_d,pkt_eop1_d,pkt_eop2_d,pkt_eop3_d,pkt_eop4_d;
(*mark_debug = "true"*) reg [4:0] pkt_mod0_d,pkt_mod1_d,pkt_mod2_d,pkt_mod3_d,pkt_mod4_d;
(*mark_debug = "true"*) reg[2:0] ram_wr; 
(*mark_debug = "true"*) reg fifo_empty_rd;  //\u6307\u793a5\u4e2aram\u4e2d\u662f\u5426\u6709\u7a7a\u95f2\u4fe1\u606f

(*mark_debug = "true"*) reg empty0,empty1,empty2,empty3,empty4;
// reg fifo_wen;
// reg[2:0] fifo_wdata;
(*mark_debug = "true"*) reg[10:0] pkt_length,pkt_length_cnt0,pkt_length_cnt1,pkt_length_cnt2,pkt_length_cnt3,pkt_length_cnt4;
(*mark_debug = "true"*) reg pkt_eop_d1;
(*mark_debug = "true"*) reg[5:0] addra;
(*mark_debug = "true"*) reg[5:0] addrb_w0,addrb_w1,addrb_w2,addrb_w3,addrb_w4;

(*mark_debug = "true"*) reg rd_en_r0,rd_en_r1,rd_en_r2,rd_en_r3,rd_en_r4;
(*mark_debug = "true"*) reg rd_en_r0_d1,rd_en_r1_d1,rd_en_r2_d1,rd_en_r3_d1,rd_en_r4_d1;

(*mark_debug = "true"*) wire rd_en_r0_pos,rd_en_r1_pos,rd_en_r2_pos,rd_en_r3_pos,rd_en_r4_pos;

(*mark_debug = "true"*) reg[4:0] select;
(*mark_debug = "true"*) wire[10:0] pkt_length_r0;
(*mark_debug = "true"*) wire[10:0] pkt_length_r1;
(*mark_debug = "true"*) wire[10:0] pkt_length_r2;
(*mark_debug = "true"*) wire[10:0] pkt_length_r3;
(*mark_debug = "true"*) wire[10:0] pkt_length_r4;

//WIRES
(*mark_debug = "true"*) wire wea0,wea1,wea2,wea3,wea4;
(*mark_debug = "true"*) wire[5:0] addra0,addra1,addra2,addra3,addra4;


(*mark_debug = "true"*) wire[255:0] dina0,dina1,dina2,dina3,dina4;

//*********************
//INSTANTCE MODULE
//*********************
//\u5b58\u50a8\u5e27
//`ifdef ASIC
ram_2p_d64_w256_wrapper U_ram0_asic(
// .clka(clk),
 .clk(clk),
 .ram_2p_cfg_register(ram_2p_cfg_register),
 .wren(wea0),
 .waddr(addra0),
 .wdata(dina0),
// .clkb(clk),
 .rden(rd_en_r0),
 .raddr(addrb_w0),
 .rdata(dout0_d) 
);
ram_2p_d64_w256_wrapper U_ram1_asic(
// .clka(clk),
 .clk(clk),
 .ram_2p_cfg_register(ram_2p_cfg_register),
 .wren(wea1),
 .waddr(addra1),
 .wdata(dina1),
// .clkb(clk),
 .rden(rd_en_r1),
 .raddr(addrb_w1),
 .rdata(dout1_d) 
);
ram_2p_d64_w256_wrapper U_ram2_asic(
// .clka(clk),
 .clk(clk),
 .ram_2p_cfg_register(ram_2p_cfg_register),
 .wren(wea2),
 .waddr(addra2),
 .wdata(dina2),
// .clkb(clk),
 .rden(rd_en_r2),
 .raddr(addrb_w2),
 .rdata(dout2_d) 
);
ram_2p_d64_w256_wrapper U_ram3_asic(
// .clka(clk),
 .clk(clk),
 .ram_2p_cfg_register(ram_2p_cfg_register),
 .wren(wea3),
 .waddr(addra3),
 .wdata(dina3),
// .clkb(clk),
 .rden(rd_en_r3),
 .raddr(addrb_w3),
 .rdata(dout3_d) 
);
ram_2p_d64_w256_wrapper U_ram4_asic(
// .clka(clk),
 .clk(clk),
 .ram_2p_cfg_register(ram_2p_cfg_register),
 .wren(wea4),
 .waddr(addra4),
 .wdata(dina4),
// .clkb(clk),
 .rden(rd_en_r4),
 .raddr(addrb_w4),
 .rdata(dout4_d) 
);
/*
`ifdef ASIC
ram_2p_d64_w256_wrapper U_ram0_asic(
// .clka(clk),
 .clk(clk),
 .ram_2p_cfg_register(ram_2p_cfg_register),
 .wren(wea0),
 .waddr(addra0),
 .wdata(dina0),
// .clkb(clk),
 .rden(rd_en_r0),
 .raddr(addrb_w0),
 .rdata(dout0_d) 
);
`else
dual_ram_256_64 U_ram0 (
  .clka(clk), // input clka
  .wea(wea0), // input [0 : 0] wea
  .addra(addra0), // input [5 : 0] addra
  .dina(dina0), // input [255 : 0] dina
  .clkb(clk), // input clkb
  .enb(rd_en_r0),
  .addrb(addrb_w0), // input [5 : 0] addrb
  .doutb(dout0_d) // output [255 : 0] doutb
);
//`endif 

`ifdef ASIC
ram_2p_d64_w256_wrapper U_ram1_asic(
// .clka(clk),
 .clk(clk),
 .ram_2p_cfg_register(ram_2p_cfg_register),
 .wren(wea1),
 .waddr(addra1),
 .wdata(dina1),
// .clkb(clk),
 .rden(rd_en_r1),
 .raddr(addrb_w1),
 .rdata(dout1_d)
);
`else  
dual_ram_256_64 U_ram1 (
  .clka(clk), // input clka
  .wea(wea1), // input [0 : 0] wea
  .addra(addra1), // input [5 : 0] addra
  .dina(dina1), // input [255 : 0] dina
  .clkb(clk), // input clkb
  .enb(rd_en_r1),
  .addrb(addrb_w1), // input [5 : 0] addrb
  .doutb(dout1_d) // output [255 : 0] doutb
);
//`endif
dual_ram_256_64 U_ram2 (
  .clka(clk), // input clka
  .wea(wea2), // input [0 : 0] wea
  .addra(addra2), // input [5 : 0] addra
  .dina(dina2), // input [255 : 0] dina
  .clkb(clk), // input clkb
  .enb(rd_en_r2),
  .addrb(addrb_w2), // input [5 : 0] addrb
  .doutb(dout2_d) // output [255 : 0] doutb
);
dual_ram_256_64 U_ram3 (
  .clka(clk), // input clka
  .wea(wea3), // input [0 : 0] wea
  .addra(addra3), // input [5 : 0] addra
  .dina(dina3), // input [255 : 0] dina
  .clkb(clk), // input clkb
  .enb(rd_en_r3),
  .addrb(addrb_w3), // input [5 : 0] addrb
  .doutb(dout3_d) // output [255 : 0] doutb
);
dual_ram_256_64 U_ram4 (
  .clka(clk), // input clka
  .wea(wea4), // input [0 : 0] wea
  .addra(addra4), // input [5 : 0] addra
  .dina(dina4), // input [255 : 0] dina
  .clkb(clk), // input clkb
  .enb(rd_en_r4),
  .addrb(addrb_w4), // input [5 : 0] addrb
  .doutb(dout4_d) // output [255 : 0] doutb
);*/
//*********************
//MAIN CORE
//********************* 


//2017.7.8\u66f4\u6539\u5185\u5bb9
//*************\u66f4\u6539\u524d*****************
//\u65e0\u6cd5\u5904\u7406100Gbit/s\u7684\u6570\u636e\u6d41
//*************\u6539\u8fdb\u540e*****************
//\u4e3a\u4e86\u4f7f\u5904\u7406\u901f\u5ea6\u8fbe\u5230100G\uff0c\u4e94\u4e2a\u901a\u9053\u7684\u603b\u7ebf\u5229\u7528\u7387\u5fc5\u987b\u8fbe\u523050%\u4ee5\u4e0a
//\u6700\u574f\u60c5\u51b5\u4e0b\uff0c\u5904\u7406\u7a81\u53d1\u7684\u6700\u77ed\u5e27\uff0c\u6bcf\u4e2a\u5e27\u7684\u5904\u7406\u65f6\u95f4\u5fc5\u987b\u538b\u7f29\u52307\u4e2a\u65f6\u949f\u4e4b\u5185
//\u6539\u8fdb\u540e\u7684\u6027\u80fd\u4e3a\uff1a\u5904\u7406\u4e00\u4e2a\u6700\u77ed\u5e27\u9700\u89817\u4e2a\u65f6\u949f\u5468\u671f
//\u53ea\u8981\u5199\u5165\u4e86\u4e00\u4e2a\u65f6\u949f\u7684\u6570\u636e\u5c31\u53ef\u4ee5\u5f00\u59cb\u8bfb\uff0c\u6765\u52a0\u5feb\u5904\u7406\u901f\u5ea6
//empty
always@(posedge clk or negedge rst_n)
  if(~rst_n)
    empty0 <= 1'b1;//ram1空信号
  else if(ram_wr == 3'd0 && pkt_eop_i /*pkt_sop_i*/) //ram1写同时帧结束
    empty0 <= 1'b0;//ram1不空
  else if( (pkt_length_cnt0[10:5] == pkt_length_r0[10:5] && pkt_length_r0[4:0] != 5'h0)||    
           (pkt_length_cnt0[10:5] == pkt_length_r0[10:5]-6'd1 && pkt_length_r0[4:0] == 5'h0)
           && rd_en_r0 && pkt_length_r0 != 11'd0)        //
    empty0 <= 1'b1;
  else 
    empty0 <= empty0;

always@(posedge clk or negedge rst_n)
  if(~rst_n)
    empty1 <= 1'b1;
  else if(ram_wr == 3'd1 && pkt_eop_i /*pkt_sop_i*/) 
    empty1 <= 1'b0;
  else if((pkt_length_cnt1[10:5] == pkt_length_r1[10:5] && pkt_length_r1[4:0] != 5'h0)||    
           (pkt_length_cnt1[10:5] == pkt_length_r1[10:5]-6'd1 && pkt_length_r1[4:0] == 5'h0)
           && rd_en_r1 && pkt_length_r1 != 11'd0)
    empty1 <= 1'b1;
  else 
    empty1 <= empty1;

always@(posedge clk or negedge rst_n)
  if(~rst_n)
    empty2 <= 1'b1;
  else if(ram_wr == 3'd2 && pkt_eop_i /*pkt_sop_i*/) 
    empty2 <= 1'b0;
  else if((pkt_length_cnt2[10:5] == pkt_length_r2[10:5] && pkt_length_r2[4:0] != 5'h0)||    
           (pkt_length_cnt2[10:5] == pkt_length_r2[10:5]-6'd1 && pkt_length_r2[4:0] == 5'h0)
           && rd_en_r2 && pkt_length_r2 != 11'd0)
    empty2 <= 1'b1;
  else 
    empty2 <= empty2;

always@(posedge clk or negedge rst_n)
  if(~rst_n)
    empty3 <= 1'b1;
  else if(ram_wr == 3'd3 && pkt_eop_i /*pkt_sop_i*/) 
    empty3 <= 1'b0;
  else if((pkt_length_cnt3[10:5] == pkt_length_r3[10:5] && pkt_length_r3[4:0] != 5'h0)||    
           (pkt_length_cnt3[10:5] == pkt_length_r3[10:5]-6'd1 && pkt_length_r3[4:0] == 5'h0)
           && rd_en_r3 && pkt_length_r3 != 11'd0)
    empty3 <= 1'b1;
  else 
    empty3 <= empty3;

always@(posedge clk or negedge rst_n)
  if(~rst_n)
    empty4 <= 1'b1;
  else if(ram_wr == 3'd4 && pkt_eop_i /*pkt_sop_i*/) 
    empty4 <= 1'b0;
  else if((pkt_length_cnt4[10:5] == pkt_length_r4[10:5] && pkt_length_r4[4:0] != 5'h0)||    
           (pkt_length_cnt4[10:5] == pkt_length_r4[10:5]-6'd1 && pkt_length_r4[4:0] == 5'h0)
           && rd_en_r4 && pkt_length_r4 != 11'd0)
    empty4 <= 1'b1;
  else 
    empty4 <= empty4;



always@(posedge clk or negedge rst_n)
  if(~rst_n)
    begin 
    ram_wr <= 3'd0;
    fifo_empty_rd <= 1'b0;
    end 
  else 
    case(ram_wr)
      3'd0:
        if(empty0)
        begin 
          ram_wr <= 3'd0;
          fifo_empty_rd <= 1'b0;
        end 
        else if(empty1)
        begin
          ram_wr <= 3'd1;
          fifo_empty_rd <= 1'b0;
        end
        else if(empty2)
        begin
          ram_wr <= 3'd2;
          fifo_empty_rd <= 1'b0;
        end
        else if(empty3)
        begin
          ram_wr <= 3'd3;
          fifo_empty_rd <= 1'b0;
        end
        else if(empty4)
        begin
          ram_wr <= 3'd4;
          fifo_empty_rd <= 1'b0;
        end
        else 
        begin 
          ram_wr <= 3'd0;
          fifo_empty_rd <= 1'b1;
        end 
      3'd1:
        if(empty1)
        begin 
          ram_wr <= 3'd1;
          fifo_empty_rd <= 1'b0;
        end 
        else if(empty2)
        begin 
          ram_wr <= 3'd2;
          fifo_empty_rd <= 1'b0;
        end 
        else if(empty3)
        begin
          ram_wr <= 3'd3;
          fifo_empty_rd <= 1'b0;
        end
        else if(empty4)
        begin
          ram_wr <= 3'd4;
          fifo_empty_rd <= 1'b0;
        end
        else if(empty0)
        begin
          ram_wr <= 3'd0;
          fifo_empty_rd <= 1'b0;
        end
        else 
        begin 
          ram_wr <= 3'd0;
          fifo_empty_rd <= 1'b1;
        end 
      3'd2:
        if(empty2)
        begin 
          ram_wr <= 3'd2;
          fifo_empty_rd <= 1'b0;
        end 
        else if(empty3)
        begin
          ram_wr <= 3'd3;
          fifo_empty_rd <= 1'b0;
        end
        else if(empty4)
        begin
          ram_wr <= 3'd4;
          fifo_empty_rd <= 1'b0;
        end
        else if(empty0)
        begin
          ram_wr <= 3'd0;
          fifo_empty_rd <= 1'b0;
        end        
        else if(empty1)
        begin 
          ram_wr <= 3'd1;
          fifo_empty_rd <= 1'b0;
        end 
        else 
        begin 
          ram_wr <= 3'd0;
          fifo_empty_rd <= 1'b1;
        end 
      3'd3:
        if(empty3)
        begin
          ram_wr <= 3'd3;
          fifo_empty_rd <= 1'b0;
        end
        else if(empty4)
        begin
          ram_wr <= 3'd4;
          fifo_empty_rd <= 1'b0;
        end
        else if(empty0)
        begin
          ram_wr <= 3'd0;
          fifo_empty_rd <= 1'b0;
        end        
        else if(empty1)
        begin 
          ram_wr <= 3'd1;
          fifo_empty_rd <= 1'b0;
        end 
        else if(empty2)
        begin 
          ram_wr <= 3'd2;
          fifo_empty_rd <= 1'b0;
        end 
        else 
        begin 
          ram_wr <= 3'd0;
          fifo_empty_rd <= 1'b1;
        end
      3'd4:
        if(empty4)
        begin
          ram_wr <= 3'd4;
          fifo_empty_rd <= 1'b0;
        end
        else if(empty0)
        begin
          ram_wr <= 3'd0;
          fifo_empty_rd <= 1'b0;
        end        
        else if(empty1)
        begin 
          ram_wr <= 3'd1;
          fifo_empty_rd <= 1'b0;
        end 
        else if(empty2)
        begin 
          ram_wr <= 3'd2;
          fifo_empty_rd <= 1'b0;
        end        
        else if(empty3)
        begin
          ram_wr <= 3'd3;
          fifo_empty_rd <= 1'b0;
        end
        else 
        begin 
          ram_wr <= 3'd0;
          fifo_empty_rd <= 1'b1;
        end
      default:
        begin 
        ram_wr <= 3'd0;
        fifo_empty_rd <= 1'b1;
        end     
    endcase

always@(posedge clk or negedge rst_n)
  if(~rst_n)
    select <= 0;
  else if(!fifo_empty_rd && pkt_sop_i)
    case(ram_wr)
    3'd0:select <= 5'h01;
    3'd1:select <= 5'h02;
    3'd2:select <= 5'h03;
    3'd3:select <= 5'h04;
    3'd4:select <= 5'h05;
    default: select <= 5'h0;
    endcase
  else 
    select <= select;


assign wea0  = (ram_wr == 3'd0 && !fifo_empty_rd)?pkt_dval_i:1'b0;
assign wea1  = (ram_wr == 3'd1 && !fifo_empty_rd)?pkt_dval_i:1'b0;
assign wea2  = (ram_wr == 3'd2 && !fifo_empty_rd)?pkt_dval_i:1'b0;
assign wea3  = (ram_wr == 3'd3 && !fifo_empty_rd)?pkt_dval_i:1'b0;
assign wea4  = (ram_wr == 3'd4 && !fifo_empty_rd)?pkt_dval_i:1'b0;


assign dina0 = (ram_wr == 3'd0 && !fifo_empty_rd)?pkt_data_i:255'h0;
assign dina1 = (ram_wr == 3'd1 && !fifo_empty_rd)?pkt_data_i:255'h0;
assign dina2 = (ram_wr == 3'd2 && !fifo_empty_rd)?pkt_data_i:255'h0;
assign dina3 = (ram_wr == 3'd3 && !fifo_empty_rd)?pkt_data_i:255'h0;
assign dina4 = (ram_wr == 3'd4 && !fifo_empty_rd)?pkt_data_i:255'h0;

assign addra0= (ram_wr == 3'd0 && !fifo_empty_rd)?addra :6'd0;
assign addra1= (ram_wr == 3'd1 && !fifo_empty_rd)?addra :6'd0;
assign addra2= (ram_wr == 3'd2 && !fifo_empty_rd)?addra :6'd0;
assign addra3= (ram_wr == 3'd3 && !fifo_empty_rd)?addra :6'd0;
assign addra4= (ram_wr == 3'd4 && !fifo_empty_rd)?addra :6'd0;


always@(posedge clk or negedge rst_n)
  if(~rst_n)
    rd_en_r0 <= 0;
  else if(pkt_sop_i && ram_wr == 3'd0)
    rd_en_r0 <= 1'b1;
  else if((pkt_length_cnt0[10:0]+11'd32) >= pkt_length_r0[10:0] 
         && pkt_length_cnt0[10:0] != 11'd0
         && pkt_length_r0 != 11'd0
         )
    rd_en_r0 <= 1'b0;
  else 
    rd_en_r0 <= rd_en_r0;

always@(posedge clk or negedge rst_n)
  if(~rst_n)
    rd_en_r0_d1 <= 1'b0;
  else 
    rd_en_r0_d1 <= rd_en_r0;

assign rd_en_r0_pos = (rd_en_r0) & (!rd_en_r0_d1);

always@(posedge clk or negedge rst_n)
  if(~rst_n)
    rd_en_r1 <= 0;
  else if(pkt_sop_i && ram_wr == 3'd1)
    rd_en_r1 <= 1'b1;
  else if((pkt_length_cnt1[10:0]+11'd32) >= pkt_length_r1[10:0] 
         && pkt_length_cnt1[10:0] != 11'd0
         && pkt_length_r1 != 11'd0
         )
    rd_en_r1 <= 1'b0;
  else 
    rd_en_r1 <= rd_en_r1;

assign rd_en_r1_pos = (rd_en_r1) & (!rd_en_r1_d1);

always@(posedge clk or negedge rst_n)
  if(~rst_n)
    rd_en_r1_d1 <= 1'b0;
  else 
    rd_en_r1_d1 <= rd_en_r1;

always@(posedge clk or negedge rst_n)
  if(~rst_n)
    rd_en_r2 <= 0;
  else if(pkt_sop_i && ram_wr == 3'd2)
    rd_en_r2 <= 1'b1;
  else if((pkt_length_cnt2[10:0]+11'd32) >= pkt_length_r2[10:0] 
         && pkt_length_cnt2[10:0] != 11'd0
         && pkt_length_r2 != 11'd0
         )
    rd_en_r2 <= 1'b0;
  else 
    rd_en_r2 <= rd_en_r2;

always@(posedge clk or negedge rst_n)
  if(~rst_n)
    rd_en_r2_d1 <= 1'b0;
  else 
    rd_en_r2_d1 <= rd_en_r2;

assign rd_en_r2_pos = (rd_en_r2) & (!rd_en_r2_d1);

always@(posedge clk or negedge rst_n)
  if(~rst_n)
    rd_en_r3 <= 0;
  else if(pkt_sop_i && ram_wr == 3'd3)
    rd_en_r3 <= 1'b1;
  else if((pkt_length_cnt3[10:0]+11'd32) >= pkt_length_r3[10:0] 
         && pkt_length_cnt3[10:0] != 11'd0
         && pkt_length_r3 != 11'd0
         )
    rd_en_r3 <= 1'b0;
  else 
    rd_en_r3 <= rd_en_r3;

always@(posedge clk or negedge rst_n)
  if(~rst_n)
    rd_en_r3_d1 <= 1'b0;
  else 
    rd_en_r3_d1 <= rd_en_r3;

assign rd_en_r3_pos = (rd_en_r3) & (!rd_en_r3_d1);

always@(posedge clk or negedge rst_n)
  if(~rst_n)
    rd_en_r4 <= 0;
  else if(pkt_sop_i && ram_wr == 3'd4)
    rd_en_r4 <= 1'b1;
  else if((pkt_length_cnt4[10:0]+11'd32) >= pkt_length_r4[10:0] 
         && pkt_length_cnt4[10:0] != 11'd0
         && pkt_length_r4 != 11'd0
         )
    rd_en_r4 <= 1'b0;
  else 
    rd_en_r4 <= rd_en_r4;

always@(posedge clk or negedge rst_n)
  if(~rst_n)
    rd_en_r4_d1 <= 1'b0;
  else 
    rd_en_r4_d1 <= rd_en_r4;

assign rd_en_r4_pos = (rd_en_r4) & (!rd_en_r4_d1);

always@(posedge clk or negedge rst_n)
  if(~rst_n)
    addra <= 0;
  else if(pkt_sop_i && pkt_eop_i)
    addra <= 0;
  else if(pkt_eop_i)
    addra <= 0;
  else if(pkt_dval_i)
    addra <= addra + 1;
  else 
    addra <= addra;
//pkt_length \u7684\u5355\u4f4d\u4e3a\u5b57\u8282
always@(posedge clk or negedge rst_n)
  if(~rst_n)
    pkt_length <= 11'd0;
  else if(pkt_sop_i && pkt_eop_i && pkt_mod_i == 5'h0)
    pkt_length <= 11'd32;
  else if(pkt_sop_i && pkt_eop_i)
    pkt_length <= pkt_mod_i; 
  else if(pkt_dval_i && pkt_mod_i == 5'h0)
    pkt_length <= pkt_length + 11'd32;
  else if(pkt_dval_i)
    pkt_length <= pkt_length + pkt_mod_i;
  else 
    pkt_length <= 11'd0;


always@(posedge clk or negedge rst_n)
  if(~rst_n)
    pkt_eop_d1 <= 0;
  else
    pkt_eop_d1 <= pkt_eop_i;

//addrb_ws
always@(posedge clk or negedge rst_n)
  if(~rst_n)
    addrb_w0 <= 0;
  else if(rd_en_r0)
    addrb_w0 <= addrb_w0+1;
  else 
    addrb_w0 <= 0;
always@(posedge clk or negedge rst_n)
  if(~rst_n)
    addrb_w1 <= 0;
  else if(rd_en_r1)
    addrb_w1 <= addrb_w1+1;
  else 
    addrb_w1 <= 0;
always@(posedge clk or negedge rst_n)
  if(~rst_n)
    addrb_w2 <= 0;
  else if(rd_en_r2)
    addrb_w2 <= addrb_w2+1;
  else 
    addrb_w2 <= 0;
always@(posedge clk or negedge rst_n)
  if(~rst_n)
    addrb_w3 <= 0;
  else if(rd_en_r3)
    addrb_w3 <= addrb_w3+1;
  else 
    addrb_w3 <= 0;
always@(posedge clk or negedge rst_n)
  if(~rst_n)
    addrb_w4 <= 0;
  else if(rd_en_r4)
    addrb_w4 <= addrb_w4+1;
  else 
    addrb_w4 <= 0;



//pkt_sop
always@(posedge clk or negedge rst_n)
  if(~rst_n)
    pkt_sop0_d <= 1'b0;
  else if(rd_en_r0_pos)
    pkt_sop0_d <= 1'b1;
  else 
    pkt_sop0_d <= 1'b0;
always@(posedge clk or negedge rst_n)
  if(~rst_n)
    pkt_sop1_d <= 1'b0;
  else if(rd_en_r1_pos)
    pkt_sop1_d <= 1'b1;
  else 
    pkt_sop1_d <= 1'b0;
always@(posedge clk or negedge rst_n)
  if(~rst_n)
    pkt_sop2_d <= 1'b0;
  else if(rd_en_r2_pos)
    pkt_sop2_d <= 1'b1;
  else 
    pkt_sop2_d <= 1'b0;
always@(posedge clk or negedge rst_n)
  if(~rst_n)
    pkt_sop3_d <= 1'b0;
  else if(rd_en_r3_pos)
    pkt_sop3_d <= 1'b1;
  else 
    pkt_sop3_d <= 1'b0;
always@(posedge clk or negedge rst_n)
  if(~rst_n)
    pkt_sop4_d <= 1'b0;
  else if(rd_en_r4_pos)
    pkt_sop4_d <= 1'b1;
  else 
    pkt_sop4_d <= 1'b0;

//pkt_length_cnt
always@(posedge clk or negedge rst_n)
  if(~rst_n)
    pkt_length_cnt0 <= 0;
  else if(rd_en_r0)
    pkt_length_cnt0 <= pkt_length_cnt0 + 11'd32;
  else 
    pkt_length_cnt0 <= 11'd0;
always@(posedge clk or negedge rst_n)
  if(~rst_n)
    pkt_length_cnt1 <= 0;
  else if(rd_en_r1)
    pkt_length_cnt1 <= pkt_length_cnt1 + 11'd32;
  else 
    pkt_length_cnt1 <= 11'd0;
always@(posedge clk or negedge rst_n)
  if(~rst_n)
    pkt_length_cnt2 <= 0;
  else if(rd_en_r2)
    pkt_length_cnt2 <= pkt_length_cnt2 + 11'd32;
  else 
    pkt_length_cnt2 <= 11'd0;
always@(posedge clk or negedge rst_n)
  if(~rst_n)
    pkt_length_cnt3 <= 0;
  else if(rd_en_r3)
    pkt_length_cnt3 <= pkt_length_cnt3 + 11'd32;
  else 
    pkt_length_cnt3 <= 11'd0;
always@(posedge clk or negedge rst_n)
  if(~rst_n)
    pkt_length_cnt4 <= 0;
  else if(rd_en_r4)
    pkt_length_cnt4 <= pkt_length_cnt4 + 11'd32;
  else 
    pkt_length_cnt4 <= 11'd0;

//pkt_eop
always@(posedge clk or negedge rst_n)
  if(~rst_n)
    pkt_eop0_d <= 1'b0;
  else if( (pkt_length_cnt0[10:5] == pkt_length_r0[10:5] && pkt_length_r0[4:0] != 5'h0)||    
           (pkt_length_cnt0[10:5] == pkt_length_r0[10:5]-6'd1 && pkt_length_r0[4:0] == 5'h0)
           && rd_en_r0 && pkt_length_r0 != 11'd0)
    pkt_eop0_d <= 1'b1;
  else 
    pkt_eop0_d <= 1'b0;

always@(posedge clk or negedge rst_n)
  if(~rst_n)
    pkt_eop1_d <= 1'b0;
  else if(((pkt_length_cnt1[10:5] == pkt_length_r1[10:5] && pkt_length_r1[4:0] != 5'h0)||
           (pkt_length_cnt1[10:5] == pkt_length_r1[10:5]-6'd1 && pkt_length_r1[4:0] == 5'h0)
           )&& rd_en_r1 && pkt_length_r1 != 11'd0)
    pkt_eop1_d <= 1'b1;
  else 
    pkt_eop1_d <= 1'b0;
  
always@(posedge clk or negedge rst_n)
  if(~rst_n)
    pkt_eop2_d <= 1'b0;
  else if( (pkt_length_cnt2[10:5] == pkt_length_r2[10:5] && pkt_length_r2[4:0] != 5'h0)||    
           (pkt_length_cnt2[10:5] == pkt_length_r2[10:5]-6'd1 && pkt_length_r2[4:0] == 5'h0)
           && rd_en_r2 && pkt_length_r2 != 11'd0)
    pkt_eop2_d <= 1'b1;
  else 
    pkt_eop2_d <= 1'b0;

always@(posedge clk or negedge rst_n)
  if(~rst_n)
    pkt_eop3_d <= 1'b0;
  else if( (pkt_length_cnt3[10:5] == pkt_length_r3[10:5] && pkt_length_r3[4:0] != 5'h0)||    
           (pkt_length_cnt3[10:5] == pkt_length_r3[10:5]-6'd1 && pkt_length_r3[4:0] == 5'h0)
           && rd_en_r3 && pkt_length_r3 != 11'd0)
    pkt_eop3_d <= 1'b1;
  else 
    pkt_eop3_d <= 1'b0;
  
always@(posedge clk or negedge rst_n)
  if(~rst_n)
    pkt_eop4_d <= 1'b0;
  else if( (pkt_length_cnt4[10:5] == pkt_length_r4[10:5] && pkt_length_r4[4:0] != 5'h0)||    
           (pkt_length_cnt4[10:5] == pkt_length_r4[10:5]-6'd1 && pkt_length_r4[4:0] == 5'h0)
           && rd_en_r4 && pkt_length_r4 != 11'd0)
    pkt_eop4_d <= 1'b1;
  else 
    pkt_eop4_d <= 1'b0;

//pkt_mod
always@(posedge clk or negedge rst_n)
  if(~rst_n)
    pkt_mod0_d <= 5'h0;
  else if(((pkt_length_cnt0[10:5] == pkt_length_r0[10:5] && pkt_length_r0[4:0] != 5'h0)||
           (pkt_length_cnt0[10:5] == pkt_length_r0[10:5]-6'd1 && pkt_length_r0[4:0] == 5'h0)
           )&& rd_en_r0 && pkt_length_r0 != 11'd0)
    pkt_mod0_d <= pkt_length_r0[4:0];
  else
    pkt_mod0_d <= 5'h0;

always@(posedge clk or negedge rst_n)
  if(~rst_n)
    pkt_mod1_d <= 5'h0;
  else if(((pkt_length_cnt1[10:5] == pkt_length_r1[10:5] && pkt_length_r1[4:0] != 5'h0)||
           (pkt_length_cnt1[10:5] == pkt_length_r1[10:5]-6'd1 && pkt_length_r1[4:0] == 5'h0)
           )&& rd_en_r1 && pkt_length_r1 != 11'd0)
    pkt_mod1_d <= pkt_length_r1[4:0];
  else
    pkt_mod1_d <= 5'h0;

always@(posedge clk or negedge rst_n)
  if(~rst_n)
    pkt_mod2_d <= 5'h0;
  else if(((pkt_length_cnt2[10:5] == pkt_length_r2[10:5] && pkt_length_r2[4:0] != 5'h0)||
           (pkt_length_cnt2[10:5] == pkt_length_r2[10:5]-6'd1 && pkt_length_r2[4:0] == 5'h0)
           )&& rd_en_r2 && pkt_length_r2 != 11'd0)
    pkt_mod2_d <= pkt_length_r2[4:0];
  else
    pkt_mod2_d <= 5'h0;

always@(posedge clk or negedge rst_n)
  if(~rst_n)
    pkt_mod3_d <= 5'h0;
  else if(((pkt_length_cnt3[10:5] == pkt_length_r3[10:5] && pkt_length_r3[4:0] != 5'h0)||
           (pkt_length_cnt3[10:5] == pkt_length_r3[10:5]-6'd1 && pkt_length_r3[4:0] == 5'h0)
           )&& rd_en_r3 && pkt_length_r3 != 11'd0)
    pkt_mod3_d <= pkt_length_r3[4:0];
  else
    pkt_mod3_d <= 5'h0;

always@(posedge clk or negedge rst_n)
  if(~rst_n)
    pkt_mod4_d <= 5'h0;
  else if(((pkt_length_cnt4[10:5] == pkt_length_r4[10:5] && pkt_length_r4[4:0] != 5'h0)||
           (pkt_length_cnt4[10:5] == pkt_length_r4[10:5]-6'd1 && pkt_length_r4[4:0] == 5'h0)
           )&& rd_en_r4 && pkt_length_r4 != 11'd0)
    pkt_mod4_d <= pkt_length_r4[4:0];
  else
    pkt_mod4_d <= 5'h0;

//pkt_dval
always@(posedge clk or negedge rst_n)
  if(~rst_n)
    pkt_dval0_d <= 1'b0;
  else if(pkt_eop0_d)
    pkt_dval0_d <= 1'b0;
  else if(rd_en_r0)
    pkt_dval0_d <= 1'b1;
  else 
    pkt_dval0_d <= pkt_dval0_d;

always@(posedge clk or negedge rst_n)
  if(~rst_n)
    pkt_dval1_d <= 1'b0;
  else if(pkt_eop1_d)
    pkt_dval1_d <= 1'b0;
  else if(rd_en_r1)
    pkt_dval1_d <= 1'b1;
  else 
    pkt_dval1_d <= pkt_dval1_d;

always@(posedge clk or negedge rst_n)
  if(~rst_n)
    pkt_dval2_d <= 1'b0;
  else if(pkt_eop2_d)
    pkt_dval2_d <= 1'b0;
  else if(rd_en_r2)
    pkt_dval2_d <= 1'b1;
  else 
    pkt_dval2_d <= pkt_dval2_d;

always@(posedge clk or negedge rst_n)
  if(~rst_n)
    pkt_dval3_d <= 1'b0;
  else if(pkt_eop3_d)
    pkt_dval3_d <= 1'b0;
  else if(rd_en_r3)
    pkt_dval3_d <= 1'b1;
  else 
    pkt_dval3_d <= pkt_dval3_d;

always@(posedge clk or negedge rst_n)
  if(~rst_n)
    pkt_dval4_d <= 1'b0;
  else if(pkt_eop4_d)
    pkt_dval4_d <= 1'b0;
  else if(rd_en_r4)
    pkt_dval4_d <= 1'b1;
  else 
    pkt_dval4_d <= pkt_dval4_d;


//pkt_length_r
assign pkt_length_r0 = (ram_wr==3'd0 && pkt_eop_d1==1'b1)?pkt_length:11'b0;
assign pkt_length_r1 = (ram_wr==3'd1 && pkt_eop_d1==1'b1)?pkt_length:11'b0;
assign pkt_length_r2 = (ram_wr==3'd2 && pkt_eop_d1==1'b1)?pkt_length:11'b0;
assign pkt_length_r3 = (ram_wr==3'd3 && pkt_eop_d1==1'b1)?pkt_length:11'b0;
assign pkt_length_r4 = (ram_wr==3'd4 && pkt_eop_d1==1'b1)?pkt_length:11'b0;

always@(posedge clk or negedge rst_n)
begin
  if(~rst_n)
  begin
    dout0 <= 256'h0;
    dout1 <= 256'h0;
    dout2 <= 256'h0;
    dout3 <= 256'h0;
    dout4 <= 256'h0;
  end
  else
  begin
    dout0 <= dout0_d;
    dout1 <= dout1_d;
    dout2 <= dout2_d;
    dout3 <= dout3_d;
    dout4 <= dout4_d;
  end
end
always @(posedge clk or negedge rst_n) 
begin
  if(~rst_n)
  begin
    pkt_sop0 <= 1'b0;
    pkt_sop1 <= 1'b0;
    pkt_sop2 <= 1'b0;
    pkt_sop3 <= 1'b0;
    pkt_sop4 <= 1'b0;
  end
  else
  begin
    pkt_sop0 <= pkt_sop0_d;
    pkt_sop1 <= pkt_sop1_d;
    pkt_sop2 <= pkt_sop2_d;
    pkt_sop3 <= pkt_sop3_d;
    pkt_sop4 <= pkt_sop4_d;
  end
end

always @(posedge clk or negedge rst_n) 
begin
  if(~rst_n)
  begin
    pkt_eop0 <= 1'b0;
    pkt_eop1 <= 1'b0;
    pkt_eop2 <= 1'b0;
    pkt_eop3 <= 1'b0;
    pkt_eop4 <= 1'b0;
  end
  else
  begin
    pkt_eop0 <= pkt_eop0_d;
    pkt_eop1 <= pkt_eop1_d;
    pkt_eop2 <= pkt_eop2_d;
    pkt_eop3 <= pkt_eop3_d;
    pkt_eop4 <= pkt_eop4_d;
  end
end

always@(posedge clk or negedge rst_n)
begin
  if(~rst_n)
  begin
    pkt_dval0 <= 1'b0;
    pkt_dval1 <= 1'b0;
    pkt_dval2 <= 1'b0;
    pkt_dval3 <= 1'b0;
    pkt_dval4 <= 1'b0;
  end
  else
  begin
    pkt_dval0 <= pkt_dval0_d;
    pkt_dval1 <= pkt_dval1_d;
    pkt_dval2 <= pkt_dval2_d;
    pkt_dval3 <= pkt_dval3_d;
    pkt_dval4 <= pkt_dval4_d;    
  end
end

always@(posedge clk or negedge rst_n)
begin
  if(~rst_n)
  begin  
    pkt_mod0 <= 5'b0;
    pkt_mod1 <= 5'b0;
    pkt_mod2 <= 5'b0;
    pkt_mod3 <= 5'b0;
    pkt_mod4 <= 5'b0;
  end
  else
  begin
    pkt_mod0 <= pkt_mod0_d;
    pkt_mod1 <= pkt_mod1_d;
    pkt_mod2 <= pkt_mod2_d;
    pkt_mod3 <= pkt_mod3_d;
    pkt_mod4 <= pkt_mod4_d;
  end
end
/*always@(*)
  if(~rst_n)
    pkt_length_r0 = 11'd0;
  else if(pkt_eop_d1 && select[0])
    pkt_length_r0 = pkt_length;
  else if(pkt_sop_i && ram_wr == 3'd0)
    pkt_length_r0 = 11'd0;
always@(*)
  if(~rst_n)
    pkt_length_r1 = 11'd0;
  else if(pkt_eop_d1 && select[1])
    pkt_length_r1 = pkt_length;
  else if(pkt_sop_i && ram_wr == 3'd1)
    pkt_length_r1 = 11'd0;*/
//*********************
endmodule    // hookup byte controller block
    
